Глава 4. Встроенный язык
«1С:Предприятие» является гибкой настраиваемой системой, с помощью которой можно решать широкий круг задач в сфере автоматизации деятельности предприятий. Специфические алгоритмы конфигурации описываются в конфигураторе системы «1С:Предприятие», в программных модулях, содержащих тексты на встроенном языке системы «1С:Предприятие».
4.1. Назначение и краткая характеристика встроенного языка
Встроенный язык системы «1С:Предприятие» предназначен для описания (на стадии разработки конфигурации) алгоритмов функционирования прикладной задачи.
Встроенный язык (далее по тексту – язык) представляет собой предметно-ориентированный язык программирования, специально разработанный с учетом возможности его применения не только профессиональными программистами. В частности, все операторы языка имеют как русское, так и англоязычное написание, которое можно использовать одновременно в одном исходном тексте. Основной язык, описываемый в данной книге, – русский, однако для каждого оператора языка приводится его англоязычный синоним.
При своей относительной простоте язык обладает некоторыми объектно-ориентированными возможностями, например, правила доступа к свойствам и методам специализированных типов данных (документам, справочникам и т. п.) подобны свойствам и методам объектов, используемых в других объектно-ориентированных языках. Однако специализированные типы данных не могут определяться средствами самого языка, а задаются в визуальном режиме.
Типизация переменных в языке не жесткая, т. е. тип переменной определяется ее значением. Переменные не обязательно объявлять в явном виде. Неявным определением переменной является ее первое упоминание в левой части оператора присваивания. Возможно также явное объявление переменных при помощи соответствующего оператора. Допускается применение массивов, структур, соответствий и других универсальных коллекций значений.
4.2. Формат исходных текстов программных модулей
4.2.1. Что такое программный модуль
Программные модули в конфигурации системы «1С:Предприятие» не являются самостоятельными программами в общепринятом понимании этого слова, поскольку они являются только частью всей конфигурации. Программный модуль – это текст на встроенном языке, в котором размещены тексты процедур и функций с необходимыми алгоритмами, вызываемые системой в определенные моменты работы. Поэтому программный модуль не имеет формальных границ своего описания типа: «Начало модуля» – «Конец модуля».
Место размещения конкретного программного модуля предоставляется конфигуратором в тех точках конфигурации, которые требуют описания специфических алгоритмов функционирования. Эти алгоритмы следует оформлять в виде процедур или функций, которые будут вызваны самой системой в заранее предусмотренных ситуациях (например, при нажатии кнопки в диалоговом окне).
Каждый отдельный программный модуль воспринимается системой как единое целое, поэтому все процедуры и функции программного модуля выполняются в едином контексте.
4.2.2. Контекст выполнения программного модуля
Каждый программный модуль связан с остальной частью конфигурации. Эта связь называется контекстом выполнения модуля.
Следует различать два вида контекста:
● глобальный контекст,
● локальный контекст выполнения конкретного модуля.
4.2.2.1. Глобальный контекст
Глобальный контекст образуется:
● значениями свойств и методов глобального контекста;
● системными перечислениями и системными наборами значений (например, КодВозвратаДиалога и Символы).
Глобальный контекст виден всем программным модулям и определяет общую языковую среду конфигурации.
4.2.2.2. Локальный контекст
Локальный контекст модуля образуется тем конкретным местом конфигурации задачи, для которого использован программный модуль. Локальный контекст виден только конкретному программному модулю и определяет для модуля набор непосредственно доступных модулю объектов, их свойств и методов.
4.2.3. Виды программных модулей
В системе «1С:Предприятие» существуют несколько видов программных модулей. Они различаются по месту размещения и доступному контексту.
4.2.3.1. Модуль управляемого приложения
Модулем управляемого приложения называется модуль, который автоматически выполняется в момент загрузки конфигурации, при старте системы «1С:Предприятие» в следующих режимах:
● тонкого клиента,
● веб-клиента,
● толстого клиента в режиме управляемого приложения.
Модуль управляемого приложения предназначен для отработки действий, связанных с сеансом работы конечного пользователя (прежде всего обработки начала и окончания сеанса работы). Модуль управляемого приложения недоступен для процедур, работающих на сервере. В нем рекомендуется реализовывать только обработчики соответствующих событий. Следует помнить, что необработанное исключение в каком-либо обработчике события модуля управляемого приложения (ПередНачаломРаботыСистемы(), ПриНачалеРаботыСистемы(), ПередЗавершениемРаботыСистемы(), ПриЗавершенииРаботыСистемы()) приведет к аварийному завершению работы всей системы.
Например, в следующем примере аварийного завершения не произойдет:
Копировать в буфер обменаПроцедура ПриНачалеРаботыСистемы() Попытка а=1/0; Исключение Сообщить("Деление на 0"); КонецПопытки; КонецПроцедуры
В тоже время следующий пример приведет к аварийному завершению:
Копировать в буфер обменаПроцедура ПриНачалеРаботыСистемы() а=1/0; КонецПроцедуры
Процедуры и функции модуля управляемого приложения, а также переменные, для которых в заголовке указано ключевое слово Экспорт, являются доступными:
● в неглобальных клиентских общих модулях,
● клиентских процедурах и функциях модуля команды,
● клиентских процедурах и функциях модуля управляемой формы.
В контексте модуля управляемого приложения доступны:
● часть глобального контекста, которая может исполняться в управляемом приложении;
● экспортируемые процедуры и функции любых клиентских общих модулей;
● экспортируемые процедуры и функции серверных неглобальных общих модулей, у которых установлено свойство Вызов сервера.
4.2.3.2. Модуль внешнего соединения
Модуль внешнего соединения расположен, как и модуль приложения, в корневом разделе конфигурации. В нем располагаются процедуры-обработчики событий, которые инициализируются при старте и окончании работы системы в режиме внешнего соединения (СОМ-соединения).
В модуле внешнего соединения возможно объявление переменных, а также объявление и описание процедур и функций, которые будут доступны для внешнего приложения.
Объекты «1С:Предприятия», доступные извне через COM-соединение:
● экспортируемые процедуры/функции модуля внешнего соединения;
● экспортируемые процедуры/функции общих модулей:
● включение и исключение модулей целиком выполняются с помощью установки свойств общих модулей;
● включение и исключение фрагментов общих модулей выполняются с помощью инструкций препроцессора;
● глобальный контекст «1С:Предприятия».
Модуль присутствует только в сессии внешнего соединения. В данном режиме характерно полное отсутствие пользовательского интерфейса.
4.2.3.3. Модуль сеанса
Модулем сеанса называется модуль, который автоматически выполняется при старте системы «1С:Предприятие» в момент загрузки конфигурации.
Модуль сеанса предназначен для инициализации параметров сеанса и отработки действий, связанных с сеансом работы. Этот общий модуль всегда исполняется в привилегированном режиме сервера «1С:Предприятия». Установка параметров сеанса выполняется в обработчике события УстановкаПараметровСеанса.
Модуль сеанса может содержать только определения процедур и функций, может использовать процедуры из общих модулей конфигурации и не содержит экспортируемых процедур и функций.
Вызов обработчика УстановкаПараметровСеанса() производится до вызова обработчика события ПередНачаломРаботыСистемы() (ПриНачалеРаботыСистемы() в случае модуля внешнего соединения).
При выполнении обработчика события УстановкаПараметровСеанса может возникнуть необходимость определить, какой сеанс стартует: фонового задания или какой-либо другой. Это может потребоваться в том случае, если для объем инициализируемых данных существенно различается, например, для фонового задания. Определить тип сеанса можно с помощью методов ПолучитьТекущийСеансИнформационнойБазы() и ПолучитьФоновоеЗадание(). Первый метод возвращает описание текущего сеанса – объект СеансИнформационнойБазы. Вызов метода ПолучитьФоновоеЗадание() у полученного объекта позволит однозначно понять, стартует сеанс фонового задания или какой-либо другой сеанс.
4.2.3.4. Общие модули
Общие модули располагаются в отдельной ветке дерева метаданных. Основным назначением общих модулей является содержание общих алгоритмов конфигурации, доступных из разных модулей. В общих модулях отсутствует раздел определения переменных и раздел основной программы, то есть они содержат только раздел процедур и функций (см. раздел «Структура программного модуля»).
В любом общем модуле возможно объявление и описание процедур и функций, которые будут доступны в любом модуле конфигурации.
Подробнее про общие модули см. здесь.
4.2.3.5. Модули прикладных объектов
Набор прикладных объектов имеет собственные модули. К таким объектам относятся:
● Менеджеры значения константы,
● Справочники,
● Документы,
● Отчеты,
● Обработки,
● Планы видов характеристик,
● Планы счетов,
● Планы видов расчетов,
● Планы обмена,
● Бизнес-процессы,
● Задачи,
● Регистры.
Модули располагаются в ветках конфигурации, в которых содержатся сами объекты, и являются свойствами объектов. Каждый объект имеет свой индивидуальный модуль. В этих модулях возможно объявление переменных, процедур и функций, которые будут доступны при работе с объектом извне во встроенном языке, дополняя контекст объекта.
В контексте модуля прикладного объекта имеется доступ к реквизитам и табличным частям объекта, а также его методам и событиям.
4.2.3.6. Модули менеджеров объектов
Каждый прикладной объект имеет менеджер, предназначенный для управления этим объектом как объектом конфигурации. С помощью менеджера можно создавать объекты, работать с формами и макетами. Модуль менеджера позволяет расширить функциональность менеджеров за счет введения процедур и функций на встроенном языке. Фактически это позволяет описать методы для объекта конфигурации (например, справочника), которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации.
Контекст модуля менеджера образуется:
● свойствами и методами глобального контекста;
● экспортируемыми процедурами и функциями глобальных общих модулей (если эти модули компилируются на сервере);
● экспортируемыми процедурами и функциями неглобальных общих модулей (если эти модули компилируются на сервере);
● локальным контекстом самого модуля.
Модуль менеджера не может иметь переменных и тела модуля.
Если функции или процедуры модуля менеджера объявлены как экспортируемые, к ним можно будет получить доступ через менеджер объекта.
Например, опишем функцию в модуле менеджера справочника Контрагенты:
Копировать в буфер обменаФункция ПолучитьСписокДебиторов() Экспорт … КонецФункции
Тогда вызов этой функции из прикладного кода будет выглядеть следующим образом:
Копировать в буфер обменаДебиторы = Справочники.Контрагенты.ПолучитьСписокДебиторов();
4.2.3.7. Модули форм
Эти модули содержатся в формах конфигурации (см. здесь). Каждая форма имеет свой индивидуальный модуль. В этих модулях возможно объявление переменных, процедур и функций, которые будут доступны при работе с формой извне во встроенном языке, дополняя контекст формы.
Контекст формы будет образован:
● локальным контекстом самого модуля формы, реквизитами формы, которой «принадлежит» модуль;
● свойствами и методами объекта УправляемаяФорма встроенного языка;
● свойствами и методами расширения формы, определяемого типом того объекта, данные которого содержатся в основном реквизите формы;
● глобальным контекстом, в том числе неглобальными общими модулями и экспортируемыми функциями и процедурами глобальных общих модулей, при этом нужно обеспечивать согласованность того, как описана процедура в модуле формы (&НаКлиенте, &НаСервере и т. д.), и того, какие свойства установлены у общего модуля (Клиент (управляемое приложение), Сервер и т. д.);
● экспортируемыми переменными, процедурами и функциями модуля управляемого приложения.
4.2.3.8. Модули команд
Модуль команды предназначен для того, чтобы описать в нем на встроенном языке те действия, которые должна выполнить система при вызове команды. Модуль команды может содержать только описание процедур и функций. Модуль команды не может иметь переменных и тела модуля.
Обработчик ОбработкаКоманды() обязательно должен предваряться инструкцией препроцессора &НаКлиенте, т. к. именно там начинается исполнение команды.
Контекст клиентских процедур модуля команды образуется:
● глобальным контекстом, в том числе неглобальными общими модулями и экспортируемыми функциями и процедурами глобальных общих модулей, при этом нужно обеспечивать согласованность того, как описана процедура в модуле формы (&НаКлиенте, &НаСервере и т. д.), и того, какие свойства установлены у общего модуля (Клиент (управляемое приложение), Сервер и т. д.);
● локальным контекстом самого модуля команды.
Контекст серверных процедур модуля команды образуется:
● свойствами и методами глобального контекста;
● экспортируемыми процедурами и функциями глобальных общих модулей, если эти модули компилируются на сервере;
● неглобальными общими модулями, если эти модули компилируются на сервере; доступны экспортируемые методы таких модулей;
● серверными методами модуля команды.
В модуле команды можно описывать методы с ключевым словом Экспорт. Однако как-либо использовать их за пределами этого модуля нельзя. Из встроенного языка невозможно получить доступ к командам и, следовательно, к их контексту тоже.
4.2.4. Формат программного модуля
Структуру программного модуля можно подразделить на следующие разделы:
● раздел определения переменных,
● раздел процедур и функций,
● раздел основной программы.
В конкретном программном модуле любой из разделов может отсутствовать.
Раздел определения переменных размещается от начала текста модуля до первого оператора Процедура, или оператора Функция, или любого исполняемого оператора. В этом разделе могут находиться только операторы объявления переменных Перем.
Раздел процедур и функций размещается от первого оператора Процедура или оператора Функция до любого исполняемого оператора вне тела описания процедур или функций.
Раздел основной программы размещается от первого исполняемого оператора вне тела последней процедуры или функции до конца модуля. В этом разделе могут находиться только исполняемые операторы. Раздел основной программы исполняется в момент инициализации модуля. Обычно в разделе основной программы имеет смысл размещать операторы инициализации переменных какими-либо конкретными значениями, которые необходимо провести до первого вызова любой из процедур или функций модуля.
Исходный текст программного модуля может состоять из операторов и комментариев.
4.2.4.1. Комментарии
Комментарий используется для размещения в исходном тексте программного модуля всякого рода пояснений к работе модуля. Хорошим тоном программирования считается, когда исходный текст содержит исчерпывающий комментарий с описанием алгоритма. В режиме исполнения программы комментарии пропускаются. В тексте программного модуля комментарий начинается парой символов «//» и заканчивается концом строки. Это значит, что комментарий можно начинать с начала строки или записывать его после оператора на той же строке. После начала комментария нельзя писать оператор на той же строке, необходимо закончить комментарий концом строки.
Копировать в буфер обменаА=В; // Это – комментарий // Это тоже комментарий
Комментарий, предшествующий процедуре или функции, может использоваться контекстной подсказкой конфигуратора. Формат такого комментария и схема работы см. здесь.
4.2.4.2. Формат операторов
Операторы имеют вид стандартного обращения к процедуре, за исключением оператора присваивания (А = В;) и синтаксических конструкций встроенного языка (например, таких как Для, Пока, Если). Между собой операторы обязательно следует разделять символом точка с запятой. Конец строки не является признаком конца оператора, т. е. операторы могут свободно переходить через строки и продолжаться на другой строке. Можно располагать произвольное число операторов в одной строке, разделяя их символом точка с запятой.
Операторы языка в программном модуле можно подразделить на две категории: операторы объявления переменных и исполняемые операторы.
Операторы объявления переменных создают имена переменных, которыми манипулируют исполняемые операторы.
Любой исполняемый оператор может иметь метку, используемую в качестве точки перехода в операторе Перейти.
В общем случае формат оператора языка следующий:
Копировать в буфер обмена~метка:Оператор[(параметры)] [ДобКлючевоеСлово];
В качестве меток используются специальные идентификаторы, начинающиеся с символа тильда и состоящие из последовательности букв, цифр и символов подчеркивание. Чтобы пометить оператор, нужно поместить перед ним метку и следующий за ней символ двоеточие.
Копировать в буфер обмена~метка:А=В;
4.2.4.3. Имена переменных, процедур и функций
Именем переменной, объявленной процедуры или функции может быть любая последовательность букв, цифр и знаков подчеркивания, начинающаяся с буквы или знака подчеркивания. Вновь создаваемые имена не должны совпадать с зарезервированными словами языка или именами свойств, непосредственно доступных в текущем контексте. Распознавание имен переменных, процедур и функций ведется без учета регистра букв.
4.2.4.4. Язык написания программных модулей
Встроенный язык системы «1С:Предприятие» является двуязычным. Почти все зарезервированные слова, имена типов значений, свойств, методов, событий имеют два имени: русское и английское. Исключение составляют слова, не имеющие аналогов в русском языке. В тексте программных модулей эти имена можно свободно смешивать, используя то русские, то английские имена без каких-либо ограничений.
4.2.4.5. Регистры букв при написании программных модулей
Регистр букв (строчные или заглавные) при написании имен переменных, свойств, методов, процедур, функций, а также функций встроенного языка не имеет значения.
4.2.4.6. Зарезервированные слова
Приведенные далее ключевые слова являются зарезервированными и не могут использоваться в качестве создаваемых имен переменных, реквизитов объектов конфигурации и объявляемых процедур и функций. В данном варианте языка каждое из ключевых слов имеет два представления – русское и английское.
|
Русское имя |
Английское имя |
|
Если |
If |
|
Тогда |
Then |
|
ИначеЕсли |
ElsIf |
|
Иначе |
Else |
|
КонецЕсли |
EndIf |
|
Для |
For |
|
Каждого |
Each |
|
Из |
In |
|
По |
To |
|
Пока |
While |
|
Цикл |
Do |
|
КонецЦикла |
EndDo |
|
Процедура |
Procedure |
|
Функция |
Function |
|
КонецПроцедуры |
EndProcedure |
|
КонецФункции |
EndFunction |
|
Перем |
Var |
|
Перейти |
Goto |
|
Возврат |
Return |
|
Продолжить |
Continue |
|
Прервать |
Break |
|
И |
And |
|
Или |
Or |
|
Не |
Not |
|
Попытка |
Try |
|
Исключение |
Except |
|
ВызватьИсключение |
Raise |
|
КонецПопытки |
EndTry |
|
Новый |
New |
|
Выполнить |
Execute |
Примечание. Регистр букв (строчные или заглавные) при написании не имеет значения.
4.2.5. Специальные символы, используемые в исходном тексте
|
Символ |
Описание |
|
// |
Двумя знаками косая черта начинается комментарий. Комментарием считается весь текст от символа до конца текущей строки |
|
| |
Используется только в строковых константах в начале строки и означает, что данная строка является продолжением предыдущей (перенос строки) |
|
~ |
Начало метки оператора |
|
: |
Окончание метки оператора |
|
; |
Символ разделения операторов |
|
( ) |
В круглые скобки заключается список параметров методов, процедур, функций и конструкторов. Также они используются в выражениях встроенного языка |
|
[ ] |
С помощью оператора квадратные скобки производится обращение к свойствам объекта по строковому представлению имени свойства. Также возможно обращение к элементам коллекций по индексу или другому параметру |
|
, |
Разделяет параметры в списке параметров методов, процедур, функций и конструкторов |
|
" " |
Обрамляет строковые литералы |
|
' ' |
Обрамляет литералы даты |
|
. |
Десятичная точка в числовых литералах. Разделитель, используемый для обращения к свойствам и методам объектов встроенного языка |
|
+ |
Операция сложения. Операция конкатенации строк |
|
- |
Операция вычитания |
|
* |
Операция умножения |
|
/ |
Операция деления |
|
% |
Получение остатка от деления. Допускается использование дробных значений делимого и делителя |
|
> |
Логическая операция Больше |
|
>= |
Логическая операция Больше или равно |
|
< |
Логическая операция Меньше |
|
<= |
Логическая операция Меньше или равно |
|
= |
Операция присваивания. Логическая операция Равно |
|
<> |
Логическая операция Не равно |
4.3. Примитивные типы данных
Во встроенном языке системы «1С:Предприятие» поддерживается набор примитивных типов данных. Для большинства примитивных типов данных предусмотрена возможность использования в тексте модуля литералов, то есть указание значения соответствующего типа непосредственно в модуле.
Копировать в буфер обмена// Пример использования литерала типа Строка А = "Моя строка"; // Пример использования литерала типа Булево Б = Истина; // Пример использования литерала типа Число В = 12345.6789;
NULL
Описание:
Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных, например, при соединении таблиц.
Литералы:
NULL
Булево (Boolean)
Описание:
Значения данного типа имеют два значения – Истина и Ложь, задаваемых соответствующими литералами. Значения данного типа возвращаются в качестве результата вычисления логических выражений.
Примечание:
В операциях сравнения встроенного языка используются логические выражения. Это означает, что в выражении сравнения не обязательно писать так:
Копировать в буфер обменаЕсли МояПеременная = Истина Тогда КонецЕсли;
Достаточно написать так:
Копировать в буфер обменаЕсли МояПеременная Тогда КонецЕсли;
Литералы:
● Истина (True),
● Ложь (False).
Дата (Date)
Описание:
Значения данного типа содержат дату от Рождества Христова (с 01 января 0001 года) и время с точностью до секунды.
Литералы:
Строка цифр, заключенная в одинарные кавычки вида ‘ГГГГММДДччммсс’, где:
● ГГГГ – четыре цифры года (включая тысячелетие и век);
● ММ – две цифры месяца;
● ДД – две цифры даты;
● чч – две цифры часа (в 24-часовом формате);
● мм – две цифры минут;
● сс – две цифры секунд.
Во встроенном языке в литерале типа Дата обязательно должно задаваться значение года, месяца и дня. Для задания даты, соответствующей началу отсчета, достаточно указать '00010101'. Допускается при указании литералов типа Дата опускать последние символы (секунды, минуты, часы и т. д.). Это означает, что данные параметры будут равны нулю (для времени) или единице (для даты).
В литерале даты допускается использование различных разделителей.
Пример:
Копировать в буфер обменаДата('2008.03.23 10:45:23') = "23.03.2008 10:45:23"
Число (Number)
Описание:
Числовым типом может быть представлено любое десятичное число. Определены основные арифметические операции над данными числового типа: сложение, вычитание, умножение и деление.
ВНИМАНИЕ! Максимально допустимая разрядность числа – 32 знака.
Литералы:
Набор цифр, написанных непосредственно в тексте модуля вида:
[+|-]{0|1|2|3|4|5|6|7|8|9}[.{0|1|2|3|4|5|6|7|8|9}]
В качестве разделителя целой и дробной части используется точка.
Пример:
Копировать в буфер обменаА = 15; Б = -968.612;
Строка (String)
Описание:
Значения данного типа содержат строку произвольной длины в формате Unicode. Строка закодирована в формате UTF-16. При необходимости указания в строке суррогатной пары, следует использовать два вызова функции Символ() с последовательным указанием значения каждого code unit из суррогатной пары.
Литералы:
Литералы строкового типа представляют собой набор символов, заключенных в кавычки. Для задания в строке символа " (кавычка) необходимо записать две кавычки подряд ("").
Кроме того, допускаются «многострочные» строковые константы. В исходном тексте многострочные константы могут задаваться двумя способами:
● Между фрагментами, представляющими отдельные строки многострочной строки, не должно встречаться никаких символов, за исключением пробелов, переводов строки и строк комментариев.
● Каждая отдельная составляющая не замыкается кавычками, а на каждой последующей строке помещен символ переноса строки «|» (вертикальная черта). В этом варианте комментарии допускаются, если строка начинается с символа комментария «//».
Пример:
Копировать в буфер обмена// Пример строки МояСтрока = "Это правильная строка"; // Пример 1 многострочной строки МояМногострочнаяСтрока = "Это |правильная |многострочная |строка"; // Пример 2 многострочной строки МояМногострочнаяСтрока = "Это тоже" //Это комментарий "правильная" "многострочная" "строка"; // Пример 3 строки с кавычками НазваниеФирмы = "ООО ""Василек"""; // Пример 4 суррогатная пара ТекстССуррогатнойПарой = "Иероглиф: " + Символ(55401) + Символ(56997);
Результат вывода на экран или печать строки НазваниеФирмы (пример 3) будет выглядеть следующим образом:
Копировать в буфер обменаООО "Василек"
Неопределено (Undefined)
Описание:
Значение данного типа применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Например, такое значение изначально имеют реквизиты с составным типом значения. Существует одно-единственное значение данного типа, задаваемое литералом.
Литералы:
Неопределено (Undefined)
Тип (Type)
Описание:
Значения данного типа используются для идентификации типов значений. Это необходимо для определения и сравнения типов. Данный тип не имеет литералов и возвращается функциями встроенного языка ТипЗнч и Тип (см. ниже).
4.4. Оператор присваивания
Оператор присваивания (=)
Описание:
Оператор присваивания (символ «=») означает присваивание значения <Источник> переменной, обозначенной как <Назначение>.
Присвоение значения необъявленной переменной, совпадающей по имени со свойством, доступном в текущем контексте, может диагностироваться как ошибка времени выполнения или во время проверки конфигурации. Чтобы избежать появления ошибок, рекомендуется явно объявлять переменные с такими именами с помощью оператора Перем.
Синтаксис:
<Назначение> = <Источник>;
Параметры:
<Назначение>
В качестве назначения может выступать переменная или свойство объекта встроенного языка, которое допускает запись.
<Источник>
Выражение, значение которого необходимо присвоить.
Пример:
Копировать в буфер обменаА = В; Стр1 = "777"; ДатаДокумента = '20020717';
4.5. Выражения языка
Выражение – это математическая, логическая или строковая формула, состоящая из соответствующих операций, по которой вычисляется значение. Математическое и логическое выражение может стоять справа от знака равенства в операторах присваивания, быть параметром процедур или функций. Логическое выражение также может быть условием в управляющих конструкциях Если, Пока, Для. Выражения состоят из констант, переменных и функций, связанных символами логических и/или арифметических операций.
4.5.1. Арифметические операции
В языке определены следующие виды арифметических операций.
|
Название |
Выражение |
|
Сложение |
(Оп1 + Оп2) |
|
Вычитание |
(Оп1 – Оп2) |
|
Умножение |
(Оп1 * Оп2) |
|
Деление |
(Оп1 / Оп2) |
|
Остаток от деления |
(Оп1 % Оп2) |
|
Унарный минус |
(-Оп1) |
Арифметические операции имеют один или два операнда, в зависимости от типа которых операция имеет ту или иную семантику. Тот или иной семантический вариант операции определяется по первому операнду. В случае несовпадения типа второго операнда с требуемым значение преобразуется к требуемому типу в соответствии с правилами преобразования типов. Если тип первого операнда не соответствует ни одному из допустимых типов, то в зависимости от ситуации может производиться преобразование типов или возбуждаться состояние ошибки выполнения.
|
Операция |
Описание действия |
|
Сложение определено для следующих типов операндов |
Число + Число Дата + Число (к дате прибавляется число секунд) |
|
Вычитание определено для следующих типов операндов |
Число – Число Дата – Число (от даты отнимается число секунд) Дата – Дата (результатом является разница между двумя датами, измеренная в секундах) |
|
Умножение |
Число * Число |
|
Деление |
Число / Число |
|
Остаток от деления |
Число % Число |
При выполнении арифметических операций с типом Дата следует помнить, что результат может иметь точность до 4 знаков после запятой (точность времени – сотни микросекунд). Однако, при выполнении операции записи такого значения в базу данных (в реквизите соответствующего типа), дробная часть числа будет отброшена. В связи с этим рекомендуется округлять до целого значение типа Число при выполнении арифметических операций со значением типа Дата.
4.5.2. Операция конкатенации
Операция конкатенации («+») используется для того, чтобы присоединить одну строку к другой. Длина результирующей строки равна сумме длин соединяемых строк. В случае несовпадения типа данных второго или последующих операндов со строковым типом их значение преобразуется к строковому типу в соответствии с правилами преобразования типов.
Копировать в буфер обменаФИО = Фамилия + " " + Имя + " " + Отчество;
4.5.3. Логические операции
Логическая операция сравнивает операнды и вырабатывает значение типа Булево: Истина или Ложь. Существует два вида логических операций: операции сравнения и булевы операции. В операциях сравнения сравниваются два значения. Булевы операции выполняются над значениями типа Булево, реализуя булеву алгебру. Символы булевых операций могут комбинироваться, образуя составные операции.
Операции сравнения:
В языке определены следующие виды операций сравнения.
|
Операция |
Выражение операции |
|
Больше |
Оп1 > Оп2 |
|
Больше или равно |
Оп1 >= Оп2 |
|
Равно |
Оп1 = Оп2 |
|
Не равно |
Оп1 <> Оп2 |
|
Меньше |
Оп1 < Оп2 |
|
Меньше или равно |
Оп1 <= Оп2 |
Операции сравнения определены для следующих типов операндов.
|
Операция |
Выражение операции |
|
Больше |
Число > Число Строка > Строка Дата > Дата |
|
Больше или равно |
Число >= Число Строка >= Строка Дата >= Дата |
|
Меньше |
Число < Число Строка < Строка Дата < Дата |
|
Меньше или равно |
Число <= Число Строка <= Строка Дата <= Дата |
|
Равно |
Любой тип = Любой тип |
|
Не равно |
Любой тип <> Любой тип |
Булевы операции:
В языке определены следующие виды булевых операций.
|
И (AND) |
конъюнкция (булево И) |
|
ИЛИ (OR) |
дизъюнкция (булево ИЛИ) |
|
НЕ (NOT) |
логическое отрицание (булево отрицание НЕ) |
Логические выражения вычисляются слева направо. Для того чтобы избежать неоднозначности и управлять последовательностью операндов, следует применять круглые скобки.
Уровни старшинства логических операций:
|
Уровень 1 |
операнды, заключенные в скобки |
|
Уровень 2 |
НЕ |
|
Уровень 3 |
И |
|
Уровень 4 |
ИЛИ |
Примечание. При вычислении логического выражения вычисляются только необходимые части выражения. Например, в выражении (Цена > 0) И ПроверкаСуммы(), если Цена <= 0, функция ПроверкаСуммы() не вызывается.
4.5.4. Приоритеты вычисления выражений встроенного языка
В следующей таблице представлен список операторов встроенного языка в порядке увеличения приоритета. Операторы с одинаковым приоритетом вычисляются слева направо.
|
Операция |
Описание |
|
OR/ИЛИ |
Логическое сложение |
|
AND/И |
Логическое умножение |
|
NOT/НЕ |
Логическое отрицание |
|
<, <=, =, >=, >, <> |
Сравнение |
|
+, - |
Сложение, вычитание |
|
*, /, % |
Умножение, деление |
|
-,+ |
Унарные плюс и минус |
|
., () |
Разыменование, вызов метода и т. п. |
Для того чтобы избежать неоднозначности и управлять последовательностью операндов, следует применять круглые скобки.
4.6. Операторы и синтаксические конструкции
? (вычислить выражение по условию)
Описание:
Позволяет вычислить одно из двух заданных выражений в зависимости от результата вычисления логического выражения.
Синтаксис:
?(<Логическое выражение>, <Выражение 1>, <Выражение 2>)
Параметры:
<Логическое выражение>
Логическое выражение, результат вычисления которого определяет одно из результирующих выражений, которые будут вычислены. Если результат его вычисления Истина, то будет вычисляться <Выражение 1>. Если результат Ложь, то <Выражение 2>.
<Выражение 1>
Результирующее выражение, которое будет вычисляться, если результат логического выражения Истина.
<Выражение 2>
Результирующее выражение, которое будет вычисляться, если результат логического выражения Ложь.
Возвращаемое значение:
Результат вычисления одного из результирующих выражений.
Пример:
Копировать в буфер обменаСтатус = ?(ПолучитьСкидку() > 10, "Особый клиент", "Обычный клиент"); Предупреждение(Статус);
ВызватьИсключение (Raise)
Описание:
При использовании данной формы оператора вызывается новое исключение.
Синтаксис:
ВызватьИсключение <Выражение>
Англоязычный синтаксис:
Raise <Expression>
Параметры:
<Выражение>
Результат вычисления выражения преобразуется к строке, и данная строка используется в качестве описания исключения.
Пример:
Копировать в буфер обменаВызватьИсключение "Документ не может быть проведен";
См. также:
Описание оператора Попытка.
Выполнить (Execute)
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.
ВНИМАНИЕ! Не рекомендуется реализовывать с помощью этого метода существенную часть функциональности прикладных решений.
Примечание. Исполняемый код не может содержать в себе отдельных процедур или функций, т. к. исполнение кода само по себе идет в рамках процедуры или функции, в которой использован этот оператор. А также не может содержать явного объявления переменных.
Синтаксис:
Выполнить(<Строка>)
Англоязычный синтаксис:
Execute(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Пример:
Копировать в буфер обмена// Выводит в окно сообщений текущую дату Выполнить("Сообщить(ТекущаяДата())");
ДобавитьОбработчик (AddHandler)
Описание:
Добавляет обработчик события.
При добавлении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначаемого в качестве обработчика.
Синтаксис:
ДобавитьОбработчик <Событие>, <ОбработчикСобытия>;
Англоязычный синтаксис:
AddHandler <Событие>, <ОбработчикСобытия>;
Параметры:
<Событие>
Событие, которому добавляется обработчик.
Событие задается в форме <Выражение>.<ИмяСобытия>, где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, к событию которого добавляется обработчик.
● <ИмяСобытия> – идентификатор (имя) события.
<ОбработчикСобытия>
Процедура/функция-обработчик события.
Обработчиком события может являться метод объекта встроенного языка. Тогда <ОбработчикСобытия> задается как <Выражение>.<ИмяОбработчика>, где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, метод которого служит обработчиком события.
● <ИмяОбработчика> – имя метода обработчика события.
Также в качестве обработчика события может быть задана процедура/функция, находящаяся в области видимости. В этом случае обработчик события задается как имя процедуры/функции.
Имеется возможность оформлять подписку на одноименные (в COM-объектах) события, но с разным числом параметров. Для этого на встроенном языке необходимо создать несколько обработчиков (каждый с указанием уникального имени и с указанием нужного количества параметров), а механизм подписки сам выберет нужный обработчик для нужной подписки.
Пример:
Копировать в буфер обменаОбработка = Обработки.КонтрольДокумента.Создать(); Накладная = Документы.Накладная.СоздатьДокумент(); ДобавитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента; msword = Новый COMОбъект("Word.Application"); ДобавитьОбработчик msword.DocumentChange, ПриИзмененииДокумента; Процедура ПриИзмененииДокумента() Сообщить("Документ изменен"); КонецПроцедуры
Пример с разными параметрами:
Копировать в буфер обмена// Обработчик без параметров Процедура ОбработкаСобытия() КонецПроцедуры // Обработчик с одним параметром Процедура ОбработкаСобытия2(Параметр) КонецПроцедуры // Объект может генерировать события как с параметром, // так и без параметров Объект = Новый COMОбъект("Test.Events"); ДобавитьОбработчик Объект.TestEvent, ОбработкаСобытия ДобавитьОбработчик Объект.TestEvent, ОбработкаСобытия2
Для (For)
Описание:
Оператор цикла Для предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла. Перед началом выполнения цикла значение <Выражение 1> присваивается переменной <Имя переменной>. Значение <Имя переменной> автоматически увеличивается при каждом проходе цикла. Величина приращения счетчика при каждом выполнении цикла равна 1. Цикл выполняется, пока значение переменной <Имя переменной> меньше или равно значению <Выражение 2>. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.
Синтаксис:
Для <Имя переменной> = <Выражение 1> По <Выражение 2> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла;
Англоязычный синтаксис:
For <Имя переменной> = <Выражение 1> To <Выражение 2> Do
// Операторы
[Break;]
// Операторы
[Continue;]
// Операторы
EndDo;
Параметры:
<Имя переменной>
Идентификатор переменной (счетчика цикла), значение которой автоматически увеличивается на 1 при каждом повторении цикла. Так называемый счетчик цикла.
<Выражение 1>
Числовое выражение, которое задает начальное значение, присваиваемое счетчику цикла при первом проходе цикла.
По
Синтаксическая связка для параметра <Выражение 2>.
<Выражение 2>
Максимальное значение счетчика цикла. Когда переменная <Имя переменной> становится больше чем <Выражение 2>, выполнение оператора цикла Для прекращается.
Цикл
Операторы, следующие за ключевым словом Цикл, выполняются, пока значение переменной <Имя переменной> меньше или равно значению <Выражение 2>.
// Операторы
Исполняемый оператор или последовательность таких операторов.
Прервать
Позволяет прервать выполнение цикла в любой точке. После выполнения этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла.
Продолжить
Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла
Ключевое слово, которое завершает структуру оператора цикла.
Пример:
Копировать в буфер обмена// Перебор дней текущего месяца ПоследнийДеньМесяца = День(КонецМесяца(ТекущаяДата())); Для ТекДень = 1 по ПоследнийДеньМесяца Цикл Состояние("Обрабатывается день: "+ ТекДень); // Операторы обработки очередного дня месяца . . . КонецЦикла;
Для каждого (For each)
Описание:
Оператор цикла Для каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции, или может быть завершен досрочно при выполнении оператора Прервать.
Синтаксис:
Для каждого <Имя переменной 1> Из <Имя переменной 2> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла
Англоязычный синтаксис:
For each <Имя переменной 1> In <Имя переменной 2> Do
// Операторы
[Break;]
// Операторы
[Continue;]
// Операторы
EndDo;
Параметры:
<Имя переменной 1>
Переменная, которой при каждом повторении цикла присваивается значение очередного элемента коллекции.
Из
Синтаксическая связка для параметра <Имя переменной 2>.
<Имя переменной 2>
Переменная или выражение, предоставляющее коллекцию. Элементы этой коллекции будут присваиваться параметру <Имя переменной 1>.
Цикл
Операторы, следующие за ключевым словом Цикл, выполняются до тех пор, пока не будут перебраны все элементы коллекции.
// Операторы
Исполняемый оператор или последовательность таких операторов.
Прервать
Позволяет прервать выполнение цикла в любой точке. После выполнения этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла.
Продолжить
Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла
Ключевое слово, которое завершает структуру оператора цикла.
Пример:
Копировать в буфер обмена// Перебор строк табличной части документа. Документ = Документы.РасходнаяНакладная.НайтиПоКоду(12345); // Проверим, найден нужный нам документ или нет Если Не Документ.Пустая() Тогда Для каждого СтрокаСостава из Документ.Состав Цикл Состояние("Строка: " + Документ.Состав.Индекс(СтрокаСостава)+1); // Операторы обработки очередной строки табличной части ... КонецЦикла; КонецЕсли;
Если (If)
Описание:
Оператор Если управляет выполнением программы, основываясь на результаты одного или более логических выражений. Оператор может содержать любое количество групп операторов, возглавляемых конструкциями ИначеЕсли – Тогда.
Синтаксис:
Если <Логическое выражение> Тогда
// Операторы
[ИначеЕсли <Логическое выражение> Тогда]
// Операторы
[Иначе]
// Операторы
КонецЕсли;
Англоязычный синтаксис:
If <Логическое выражение> Then
// Операторы
[ElsIf <Логическое выражение> Then]
// Операторы
[Else]
// Операторы
EndIf;
Параметры:
<Логическое выражение>
Логическое выражение.
Тогда
Операторы, следующие за Тогда, выполняются, если результатом логического выражения является значение Истина.
// Операторы
Исполняемый оператор или последовательность таких операторов.
ИначеЕсли
Логическое выражение, следующее за ключевым словом ИначеЕсли, вычисляется только тогда, когда условия в Если и всех предшествующих ИначеЕсли оказались равны Ложь. Операторы, следующие за конструкцией ИначеЕсли – Тогда, выполняются, если результат логического выражения в данном ИначеЕсли равен Истина.
Иначе
Операторы, следующие за ключевым словом Иначе, выполняются, если результаты логических выражений в конструкции Если и всех предшествующих конструкциях ИначеЕсли оказались равны Ложь.
КонецЕсли
Ключевое слово, которое завершает структуру оператора условного выполнения.
Пример:
Копировать в буфер обменаЕсли ДеньНедели(ТекущаяДата()) = 6 Тогда Сообщить("Сегодня суббота."); ИначеЕсли ДеньНедели(ТекущаяДата()) = 7 Тогда Сообщить("Сегодня воскресенье."); Иначе Сообщить("Сегодня рабочий день."); КонецЕсли;
Новый (New)
Описание:
Оператор позволяет создать значение указанного типа. Допустим только для тех типов, для которых разрешено создание новых значений. Для прикладных объектов необходимо использовать функциональную форму оператора Новый (вариант 2), так как при проверке модулей в конфигураторе не определены типы для прикладных объектов.
Синтаксис (вариант 1):
Новый <Имя типа>[(<Парам 1>, ..., <Парам N>)]
Параметры:
Имя типа
Указывается имя типа, значение которого создается.
<Парам 1>, ..., <Парам N>
После имени типа в скобках могут указываться параметры, если они определены в конструкторах для данного типа. Допустимое количество параметров и их назначение указываются в описании конструкторов объекта.
Пример:
Копировать в буфер обмена// Пример создания массива из трех элементов. Массив = Новый Массив(3);
Синтаксис (вариант 2):
Новый (<Тип>[, <Параметры конструктора>])
Параметры:
Тип
Имя типа или значение типа Тип.
<Параметры конструктора>
Массив параметров конструктора.
Пример:
Копировать в буфер обменаТипЗначения = Тип("КвалификаторыСтроки"); Параметры = Новый Массив(2); Параметры[0] = 20; Параметры[1] = ДопустимаяДлина.Переменная; КвалифСтр = Новый(ТипЗначения, Параметры);
Перейти (Goto)
Описание:
Безусловная передача управления на другой оператор программы. Передает управление от одного оператора к другому.
Область действия оператора ограничивается программным модулем, процедурой или функцией; он не может передать управление за пределы программного модуля, процедуры или функции.
Примечание 1. Метка в этом операторе не должна быть меткой перехода на оператор Процедура или Функция.
Примечание 2. Оператор безусловного перехода не может быть использован для передачи управления на операторы, находящиеся внутри конструкций: Пока – КонецЦикла, Для – КонецЦикла, Для каждого – КонецЦикла, Если – КонецЕсли, Попытка – Исключение – КонецПопытки извне этих конструкций.
Синтаксис:
Перейти <Метка>;
Пример:
Копировать в буфер обменаПерейти ~Метка1; ... ~ Метка1: Сообщить("Осуществлен переход по метке.");
Перем (Var)
Описание:
Позволяет в явном виде объявить переменную.
Синтаксис:
Перем <Имя переменной 1> [Экспорт] [, <Имя переменной 2>, …];
Англоязычный синтаксис:
Var <Имя переменной 1> [Export] [, <Имя переменной 2>, …];
Параметры:
<Имя переменной 1>[, <Имя переменной 2>, …]
Задается имя или имена объявляемых переменных.
Экспорт
Необязательное ключевое слово. Указывает, что данная переменная доступна при обращении к контексту этого модуля из других модулей. Данное ключевое слово необходимо указывать для каждой объявляемой переменной отдельно. Не имеет смысла при объявлении переменных отдельных процедур или функций.
Пример:
Копировать в буфер обмена// Пример объявления одной переменной Перем А Экспорт; Перем Б; // Пример объявления нескольких переменных одним оператором Перем А, Б Экспорт;
Неявное объявление переменных:
В языке необязательно объявлять переменные в явном виде. Неявным определением переменной является первое ее появление в левой части оператора присваивания. Тип переменной определяется типом присвоенного ей значения. Не допускается использование в выражениях переменных, не объявленных ранее в явном или неявном виде.
Область использования переменной:
Область использования переменных зависит от места их определения в конфигурации. Существует три области, в которых можно объявить переменные:
● В разделе определения переменных программного модуля управляемого приложения. Это глобальные переменные.
● В разделе определения переменных модуля. Это переменные модуля.
● В процедуре или функции. Это локальные переменные.
Глобальные переменные, объявленные с ключевым словом Экспорт, доступны для использования в исполняемых операторах, выражениях, в любой процедуре и функции любого клиентского программного модуля конфигурации.
Переменные модуля доступны для использования в исполняемых операторах, выражениях, в любой процедуре и функции того программного модуля, в пределах которого они объявлены. Если они объявлены с ключевым словом Экспорт, то они доступны из других модулей через контекст модуля, в котором они объявлены.
Локальные переменные доступны в пределах той процедуры или функции, в которой они объявлены.
Если переменная определена как глобальная, то она видна из всех процедур и функций любого клиентского программного модуля конфигурации. Если же переменная определена внутри процедуры, то ее областью видимости является данная процедура или функция.
Таким образом, если две переменные с одинаковыми именами используются в двух различных процедурах модуля и имя этой переменной не упоминается как глобальное, то это две различные переменные, локальные для процедур. Если же переменная определена как глобальная переменная, то любое использование имени этой переменной будет приводить к обращению к одной и той же переменной.
Единственный способ создать для процедуры локальную переменную с именем, совпадающим с именем переменной, определенной как глобальная, – это объявить ее явно при помощи оператора Перем.
Пока (While)
Описание:
Оператор цикла Пока предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла. Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.
Синтаксис:
Пока <Логическое выражение> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла
Англоязычный синтаксис:
While <Логическое выражение> Do
// Операторы
[Break;]
// Операторы
[Continue;]
// Операторы
EndDo;
Параметры:
<Логическое выражение>
Логическое выражение.
Цикл
Операторы, следующие за ключевым словом Цикл, выполняются, пока результат логического выражения равен Истина.
// Операторы
Исполняемый оператор или последовательность таких операторов.
Прервать
Позволяет прервать выполнение цикла в любой точке. После выполнения этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла.
Продолжить
Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла
Ключевое слово, которое завершает структуру оператора цикла.
Пример:
Копировать в буфер обменаВыборкаДок = Документы.РасходнаяНакладная.Выбрать(); // Цикл по всем документам Пока ВыборкаДок.Следующий() Цикл // Отобразим Документ в панели состояния Состояние("Обрабатывается документ №" + ВыборкаДок.Номер); // Операторы выполнения действий над документом КонецЦикла;
Попытка (Try)
Описание:
Оператор Попытка управляет выполнением программы, основываясь на возникающих при выполнении модуля ошибочных (исключительных) ситуациях, и определяет обработку этих ситуаций.
В качестве ошибочных (исключительных) ситуаций воспринимаются ошибки времени выполнения модуля. Не предусмотрено определяемых пользователем исключений.
Если при выполнении последовательности операторов попытки произошла ошибка времени выполнения, то выполнение оператора, вызвавшего ошибку, прерывается и управление передается на первый оператор последовательности операторов исключения. При этом управление будет передано даже в том случае, если ошибку вызвал оператор, находящийся в процедуре или функции, вызванной из операторов попытки. Если ошибка произошла в вызванной процедуре или функции, то ее выполнение будет прервано, а локальные переменные – уничтожены. Это справедливо для любой вложенности вызовов. После выполнения последовательности операторов исключения управление передается на следующий за ключевым словом КонецПопытки оператор. Если же последовательность операторов попытки выполнилась без ошибок, то последовательность операторов исключения будет пропущена и управление также будет продолжено с оператора, следующего за ключевым словом КонецПопытки.
Конструкции Попытка – Исключение – КонецПопытки могут быть вложенными. При этом при возникновении исключительной ситуации управление передается на тот обработчик, в попытке которого произошла ошибка. Если же в последовательности операторов исключения этого обработчика выполняется оператор ВызватьИсключение, выполнение передается вышестоящему обработчику исключения и так далее. Если вышестоящего обработчика нет, исключительная ситуация обрабатывается системно с прекращением выполнения программного модуля.
В выдаче диагностики помощь могут оказать встроенные функции ОписаниеОшибки() и ИнформацияОбОшибке() (см. описание функций встроенного языка). Также следует учитывать, что попадание во вложенный обработчик исключения приводит к тому, что информация о «родительском» исключении теряется.
Синтаксис:
Попытка
// Операторы попытки
Исключение
// Операторы исключения
[ВызватьИсключение;]
// Операторы исключения
КонецПопытки;
Англоязычный синтаксис:
Try
// Операторы попытки
Except
// Операторы исключения
[Raise;]
// Операторы исключения
EndTry;
Параметры:
// Операторы попытки
Исполняемый оператор или последовательность таких операторов.
Исключение
Операторы, следующие за ключевым словом Исключение, выполняются, если при выполнении последовательности операторов произошла ошибка времени выполнения.
// Операторы исключения
Исполняемый оператор или последовательность операторов, которые обрабатывают исключительную ситуацию.
ВызватьИсключение
Оператор позволяет вызвать исключение в тех случаях, когда, несмотря на отработку исключительной ситуации, необходимо прервать выполнение модуля с ошибкой времени выполнения. Оператор допустим только внутри операторных скобок Исключение – КонецПопытки.
Выполнение данного оператора прекращает выполнение последовательности операторов исключения, и производится поиск более «внешнего» обработчика исключения (при вложенных попытках). Если таковой есть, то управление передается на его первый оператор. Если нет, то исключительная ситуация обрабатывается системно, выдается сообщение о первоначально возникшей ошибке, а выполнение модуля прекращается.
КонецПопытки
Ключевое слово, которое завершает структуру оператора обработки исключительных ситуаций.
Пример:
Копировать в буфер обменаПроцедура СформироватьВExcel() Попытка // Пытаемся обратиться к программе MS Excel Табл = Новый ComObject("Excel.Application"); Исключение Предупреждение(ОписаниеОшибки()); Возврат; КонецПопытки; // Операторы формирования отчета ... КонецПроцедуры
Процедура (Procedure)
Описание:
Ключевое слово Процедура начинает секцию исходного текста, выполнение которого можно инициировать из любой точки программного модуля, просто указав ИмяПроцедуры() со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле приложения или общем программном модуле в теле описания процедуры использовано ключевое слово Экспорт, то это означает, что данная процедура является доступной из всех других программных модулей конфигурации.
При выполнении оператора Возврат процедура заканчивается и возвращает управление в точку вызова. Если в тексте процедуры не встретился оператор Возврат, то после выполнения последнего исполняемого оператора происходит выполнение неявного оператора Возврат. Конец программной секции процедуры определяется по оператору КонецПроцедуры.
Переменные, объявленные в теле процедуры в разделе Объявления локальных переменных, являются локальными переменными данной процедуры, поэтому доступны только в этой процедуре (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).
Примечание. Ключевые слова Процедура, КонецПроцедуры являются не операторами, а операторными скобками, поэтому не должны заканчиваться точкой с запятой (это может приводить к ошибкам выполнения модуля).
Синтаксис:
Процедура <ИмяПроцедуры>([[Знач] <Парам 1> [=<ДефЗнач>], ... ,[Знач] <Парам N> [=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;
...
[Возврат;]
// Операторы;
...
КонецПроцедуры
Англоязычный синтаксис:
Procedure <ИмяПроцедуры>([[Val] <Парам 1> [=<ДефЗнач>], ... ,[Val] <Парам N>[=<ДефЗнач>]])[Export]
// Объявления локальных переменных;
// Операторы;
...
[Return;]
// Операторы;
...
EndProcedure
Параметры:
<ИмяПроцедуры>
Назначает имя процедуры.
Знач
Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т. е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры значения формального параметра приведет к изменению значения соответствующего фактического параметра.
<Парам 1>, ..., <Парам N>
Необязательный список формальных параметров, разделяемых запятыми. Значения формальных параметров должны соответствовать значениям передаваемых при вызове процедуры фактических параметров. В этом списке определяются имена каждого из параметров так, как они используются в тексте процедуры. Список формальных параметров может быть пуст.
=<ДефЗнач>
Необязательная установка значения параметра по умолчанию. Параметры с установленными значениями по умолчанию можно располагать в любом месте списка формальных параметров (подробнее см. раздел «Передача параметров процедур и функций»).
Экспорт
Необязательное ключевое слово, которое указывает на то, что данная процедура является доступной из других программных модулей.
// Объявления локальных переменных
Объявляются локальные переменные, на которые можно ссылаться только в рамках этой процедуры (см. оператор Перем).
// Операторы
Исполняемые операторы процедуры.
Возврат
Необязательное ключевое слово, которое завершает выполнение процедуры и осуществляет возврат в точку программы, из которой было обращение к процедуре. Использование данного оператора в процедуре необязательно.
КонецПроцедуры
Обязательное ключевое слово, обозначающее конец исходного текста процедуры, завершение выполнения процедуры. Возврат в точку, из которой было обращение к процедуре.
Пример:
Копировать в буфер обменаПерем Глоб; // Описание процедуры Процедура МояПроцедура(Пар1, Пар2, Пар3) Экспорт Глоб = Глоб + Пар1 + Пар2 + Пар3; Возврат; КонецПроцедуры Глоб = 123; МояПроцедура(5, 6, 7); // Вызов процедуры
УдалитьОбработчик (RemoveHandler)
Описание:
Удаляет обработчик события.
При удалении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначенного в качестве обработчика.
Синтаксис:
УдалитьОбработчик <Событие>, <ОбработчикСобытия>;
Англоязычный синтаксис:
RemoveHandler <Событие>, <ОбработчикСобытия>;
Параметры:
<Событие>
Событие, обработчик которого удаляется.
Событие задается в форме <Выражение>.<ИмяСобытия>, где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, обработчик события которого удаляется.
● <ИмяСобытия> – идентификатор (имя) события.
<ОбработчикСобытия>
Процедура/функция-обработчик события.
Обработчиком события может являться метод объекта встроенного языка. Тогда <ОбработчикСобытия> задается как <Выражение>.<ИмяОбработчика>, где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, метод которого служит обработчиком события.
● <ИмяОбработчика> – имя метода обработчика события.
Также в качестве обработчика события может быть задана процедура/функция, находящаяся в области видимости. В этом случае обработчик события задается как имя процедуры/функции.
Пример:
Копировать в буфер обменаУдалитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;
Функция (Function)
Описание:
Ключевое слово Функция начинает секцию исходного текста функции, выполнение которой можно инициировать из любой точки программного модуля, просто указав ИмяФункции со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле приложения или общем программном модуле в теле описания функции использовано ключевое слово Экспорт, то это означает, что данная функция является доступной из всех других программных модулей конфигурации.
Выполнение функции заканчивается оператором Возврат. Функции отличаются от процедур только тем, что возвращают ВозвращаемоеЗначение. Конец программной секции функции определяется по оператору КонецФункции.
Вызов любой функции в тексте программного модуля можно записывать как вызов процедуры, т. е. в языке допускается не принимать от функции возвращаемое значение.
Если ключевое слово Возврат в теле функции не указано или строка модуля, его содержащая, не выполнена, то функция возвращает значение типа Неопределено.
Переменные, объявленные в теле функции в разделе Объявления локальных переменных, являются локальными переменными данной функции, поэтому доступны только в этой функции (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).
Примечание. Ключевые слова Функция, КонецФункции являются не операторами, а операторными скобками, поэтому не должны заканчиваться точкой с запятой (это может приводить к ошибкам выполнения модуля).
Синтаксис:
Функция <ИмяФункции>([[Знач] <Парам 1>[=<ДефЗнач>], ... ,[Знач] <Парам N>[=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;
...
Возврат <Возвращаемое значение>;
// Операторы;
...
КонецФункции
Англоязычный синтаксис:
Function <ИмяФункции>([[Val] <Парам 1>[=<ДефЗнач>], ... ,[Val] <Парам N>[=<ДефЗнач>]])[Export]
// Объявления локальных переменных;
// Операторы;
...
Return <Возвращаемое значение>;
// Операторы;
...
EndFunction
Параметры:
<ИмяФункции>
Назначает имя функции.
Знач
Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т. е. изменение значения формального параметра при выполнении функции никак не повлияет на фактический параметр, переданный при вызове функции. Если это ключевое слово не указано, то параметр функции передается по ссылке, то есть изменение внутри функции значения формального параметра приведет к изменению значения соответствующего фактического параметра.
<Парам 1>, ..., <Парам N>
Необязательный список формальных параметров, разделяемых запятыми. Значения формальных параметров должны соответствовать значениям передаваемых при вызове функции фактических параметров. В этом списке определяются имена каждого из параметров так, как они используются в тексте функции. Список формальных параметров может быть пуст.
=<ДефЗнач>
Необязательная установка значения параметра по умолчанию. Параметры с установленными значениями по умолчанию можно располагать в любом месте списка формальных параметров (подробнее см. раздел «Передача параметров процедур и функций»).
Экспорт
Необязательное ключевое слово, которое указывает на то, что данная функция является доступной из других программных модулей.
// Объявления локальных переменных
Объявляются локальные переменные, на которые можно ссылаться только в рамках этой функции (см. оператор Перем).
// Операторы
Исполняемые операторы функции.
Возврат <Возвращаемое значение>
Ключевое слово, которое завершает выполнение функции и возвращает указанное значение в выражение, в котором используется функция.
В качестве возвращаемого значения может выступать выражение или переменная, значение которого содержит результат обращения к функции.
КонецФункции
Ключевое слово, обозначающее конец исходного текста функции.
Пример:
Копировать в буфер обменаПерем Глоб; // Описание функции Функция МояФункция(Пар1, Пар2, Пар3) Экспорт Глоб = Глоб + Пар1 + Пар2 + Пар3; Возврат Глоб; КонецФункции Глоб = 123; Рез = МояФункция(5, 6, 7); // Вызов функции
4.7. Основные приемы работы
4.7.1. Обращение к свойствам объектов
Помимо основного обращения через точку, в языке системы «1С:Предприятие» предусмотрен механизм обращения к свойствам объектов по строке с именем свойства с помощью оператора [] (квадратные скобки).
Свойство объекта ([])
Описание:
Такая конструкция позволяет обращаться к свойствам объектов так же, как это делается через точку с указанием имени свойства.
Синтаксис:
<Объект>[<Имя свойства>]
Параметры:
<Объект>
Объект, к свойству которого идет обращение.
<Имя свойства>
Тип Строка. Имя свойства, к которому необходимо обратиться.
Пример:
Копировать в буфер обменаСпр = Справочники.Номенклатура.НайтиПоКоду(ИскомыйКод); // Обращение к наименованию справочника по строке с именем свойства A = Спр["Наименование"]; // Обращение к наименованию справочника по имени свойства A = Спр.Наименование; // Оба эти обращения к свойству абсолютно равнозначны
4.7.2. Дополнение контекста объектов и форм
В языке есть возможность при обращении к объектам и формам извне, из других программных модулей, обращаться к переменным, процедурам и функциям этих модулей, как к свойствам и методам самих объектов и форм. Можно обращаться к тем переменным, процедурам и функциям, которые объявлены с ключевым словом Экспорт. Для форм дополнительно возможно обращение к реквизитам формы.
Пример:
Копировать в буфер обмена// Пример использования процедуры печати документов из журнала // документов. Допустим, у нас есть несколько различных документов, // причем у всех есть процедура Печать(). В модуле журнала // документов располагается кнопка "Печать", которая // вызывает процедуру печати текущего документа журнала. Процедура ПечатьНажатие(Элемент) // Получим текущий документ, на котором установлен курсор. ТекДок = ЭлементыФормы.ЖурналСписок.ТекущаяСтрока; // Получим основную форму текущего документа. ФрмТекДок = ТекДок.ПолучитьФорму(); // Вызовем процедуру печати, расположенную // в модуле формы документа. ФрмТекДок.Печать(); КонецПроцедуры
4.7.3. Передача параметров процедур и функций
Передача параметров процедур и функций выполняется двумя способами. Один способ называется передачей по ссылке и представляет собой передачу не конкретного значения параметра, а адреса памяти (ссылки на переменную), где расположено это значение. Изменение переданного значения в вызываемой процедуре или функции приведет к изменению передаваемой переменной в вызывающем методе.
Другой способ называется передачей по значению и представляет собой передачу копии значения параметра. В этом случае изменение переданного значения в вызываемой процедуре или функции не приведет к изменению значения передаваемой переменной в вызывающем методе.
В то же время механизм передачи параметров процедур и функций зависит от того, какой вызов будет выполняться:
● вызов без передачи управления между клиентом и сервером (только на клиенте или только на сервере);
● вызов с передачей управления между клиентом и сервером.
Подробнее рассмотрим каждый из способов вызова.
4.7.3.1. Вызов без передачи управления с клиента на сервер
Если вызов происходит без передачи управления между клиентом и сервером (вызов происходит только на клиентской или только на серверной стороне), то по умолчанию параметры передаются по ссылке. При этом изменение формального параметра ведет к изменению соответствующего фактического параметра. С помощью модификатора Знач перед именем формального параметра можно указать, что параметр передается по значению. В этом случае нельзя изменить значение фактического параметра путем присвоения формальному параметру какого-либо значения.
Копировать в буфер обмена&НаКлиенте Процедура МояПроцедура() А = 100; ПоСсылке(А); // Переменная А = 40, так как в теле процедуры значение // параметра Параметр1 изменено на 40. // Изменение переменной А произошло потому, что параметр передавался по ссылке А = 100; ПоЗначению(А); // Переменная А = 100, несмотря на то, что в в теле процедуры // значение параметра Параметр1 изменено на 40. // Изменение переменной А не произошло, так как параметр передавался по значению КонецПроцедуры &НаКлиенте Процедура ПоСсылке(Параметр1) Параметр1 = 40; КонецПроцедуры &НаКлиенте Процедура ПоЗначению(Знач Параметр1) Параметр1 = 40; КонецПроцедуры
Однако необходимо помнить следующую особенность: если параметром передается агрегатный объект, то невозможно присвоить фактическому параметру другое значение, но возможно изменить сам переданный объект. Например, если в процедуру по значению передан массив, то можно очистить этот массив методом Очистить(), но нельзя изменить в вызывающей процедуре само значение параметра.
Копировать в буфер обмена&НаКлиенте Процедура МояПроцедура() Массив = Новый Массив; Массив.Добавить(12); Массив.Добавить(18); // В массиве есть два элемента ПоЗначению(Массив); // Массив пустой, но это по-прежнему массив, а не Число КонецПроцедуры // Параметр передается по значению &НаКлиенте Процедура ПоЗначению(Знач Параметр) // В массиве два значения Параметр.Очистить(); // В массиве нет значений! // Меняем формальный параметр Параметр = 14; // Изменено значение только формального параметра КонецПроцедуры
Также следует учитывать особенности хранения переменных при организации вызовов:
Копировать в буфер обмена&НаКлиенте Процедура ТестоваяПроцедура() ЗначениеА = Новый Массив; ЗначениеА.Добавить(1); ЗначениеА.Добавить(2); ЗначениеБ = ЗначениеА; // обращение к любой переменной: ЗначениеА или ЗначениеБ вызывает // изменение одного и того же масива МояПроцедура(ЗначениеА, ЗначениеБ); // После завершения вызова процедуры обе переменные (ЗначениеА и ЗначениеБ) // ссылаются на один массив. // В массиве находятся следующие значения: // ЗначениеА[0] = ЗначениеБ[0] = "А" // ЗначениеА[1] = ЗначениеБ[1] = "Б" КонецПроцедуры &НаКлиенте Процедура МояПроцедура(Параметр1, Параметр2) // Несмотря на то, что параметров два, фактически работа происходит с одним массивом Параметр1[0] = 5; Параметр1[1] = 6; Параметр2[0] = "А"; Параметр2[1] = "Б"; КонецПроцедуры
В данном примере следует обратить внимание на тот факт, что операция присваивания ЗначениеБ = ЗначениеА; (в процедуре ТестоваяПроцедура()) не приведет к созданию копии массива, который находится в переменной ЗначениеА. Обе переменные будут ссылаться на один и тот же массив!
При этом в процедуру МояПроцедура() параметры передаются по ссылке, следовательно, при изменении двух разных формальных параметров происходит изменение одного физического массива.
4.7.3.2. Вызов с передачей управления с клиента на сервер
Вызов процедур и функций с передачей управления между клиентом и сервером характерен тем, что в общем случае при таком вызове изменяется компьютер, на котором происходит работа вызываемого метода. Это происходит потому, что клиент работает на одном компьютере, а сервер – на другом. Следовательно, нельзя говорить о передаче параметров по ссылке, т. к. один компьютер не может получить прямого доступа к памяти другого компьютера. При работе в файл-серверном варианте клиент и сервер представляют собой один компьютер, но на логику взаимодействия это не влияет. Поэтому передача параметров в случае клиент-серверного взаимодействия происходит особым образом:
● При передаче управления с клиента на сервер (и обратно) всегда передаются копии параметров. При вызове серверной процедуры или функции с клиента происходит создание копии фактического параметра и передача этой копии на сторону сервера. При возврате управления с сервера на клиента также происходит создание копии формального параметра (с которым происходила работы в вызванной процедуре или функции) для передачи обратно на клиента.
● Если формальный параметр указан с модификатором Знач, то значение параметра будет передаваться только при вызове процедуры или функции и не будет передаваться обратно при возврате управления на клиента.
● Если для нескольких формальных параметров указывается одно и то же фактическое значение, то создается столько копий фактического значения, для скольких формальных параметров используется значение.
● Если в качестве формальных параметров указано значение одной и той же переменной, то после возврата управления с сервера значение этой переменной будет установлено в значение самого правого формального параметра (без модификатора Знач), который изменялся в вызываемой функции.
Копировать в буфер обмена&НаКлиенте Процедура ТестоваяПроцедура(Команда) ЗначениеА = Новый Массив; ЗначениеА.Добавить(1); ЗначениеА.Добавить(2); ЗначениеБ = ЗначениеА; // обращение к любой переменной: ЗначениеА или ЗначениеБ вызывает // изменение одного и того же масива // При вызове процедуры создается копия массива для каждого формального параметра СервернаяПроцедура(ЗначениеА, ЗначениеБ); // После завершения вызова процедуры: // 1. Переменные ЗначениеА и ЗначениеБ ссылаются на разные массивы // 2. В массивах находятся разные значения // ЗначениеА[0] = 5 // ЗначениеА[1] = 6 // ЗначениеБ[0] = "А" // ЗначениеБ[1] = "Б" КонецПроцедуры &НаСервере Процедура СервернаяПроцедура(Параметр1, Параметр2) // Так как передаются копии, для каждого формального параметра на сервере создан "свой" массив Параметр1[0] = 5; Параметр1[1] = 6; Параметр2[0] = "А"; Параметр2[1] = "Б"; // С сервера будут возвращаться копии переменных Параметр1 и Параметр2 КонецПроцедуры
Следует всегда помнить о том, что при передаче параметров на сервер создается копия значения. Это позволит избежать труднодиагностируемых ошибок при работе системы. Рассмотрим пример:
Копировать в буфер обмена&НаКлиенте Процедура ТестоваяПроцедура(Команда) ЗначениеА = Новый Массив; ЗначениеА.Добавить(1); ЗначениеА.Добавить(2); ЗначениеБ = ЗначениеА; Структура = Новый Структура("Ключ1, Ключ2", ЗначениеА, ЗначениеА); СервернаяПроцедура(Структура); ЗначениеА[0] = 9; ЗначениеА[1] = 8; ЗначениеБ[0] = "C"; ЗначениеБ[1] = "D"; КонецПроцедуры &НаСервере Процедура СервернаяПроцедура(Параметр1) Параметр1.Ключ1[0] = "0"; Параметр1.Ключ1[1] = "1"; Параметр1.Ключ2[0] = "2"; Параметр1.Ключ2[1] = "3"; КонецПроцедуры
После завершения вызова процедуры ТестоваяПроцедура() будет наблюдаться следующее состояние переменных:
● Массивы ЗначениеА и ЗначениеБ идентичны и содержат значения «С» в первом элементе и значение «D» во втором элементе, т. к. переменная ЗначениеБ указывает на массив из переменной ЗначениеА и значения этих переменных не передавались на сервер.
● В переменной Структура будут находиться два массива:
● Со значениями «0» и «1» для элементов массива, находящегося в элементе структуры с ключом Ключ1.
● Со значениями «2» и «3» для элементов массива, находящегося в элементе структуры с ключом Ключ2.
● Такое поведение будет обусловлено тем, что при вызове процедуры происходит создание копии не только самого параметра (переменная Структура), но и всех объектов, находящихся в этой структуре: два массива, которые изначально указывали на один массив со значениями элементов «0» и «1».
4.7.3.3. Общие особенности указания параметров
При передаче параметров в метод (процедуру или функцию) различаются две ситуации: когда параметр опущен и когда параметр пропущен. Пропущенный параметр – это параметр, значение которого явным образом не указано. Если пропускается несколько параметров, то в строке с вызовом метода каждый из пропускаемых параметров должен быть отмечен «своей» разделительной запятой.
Копировать в буфер обменаПроцедура МояПроцедура(Параметр1, Параметр2) … КонецПроцедуры // Параметр Параметр1 – пропущен МояПроцедура( ,1);
Опущенным может быть только один или несколько параметров, указанных справа в списке формальных параметрах при описании метода. При этом опускать можно только параметры, которые имеют значение по умолчанию. Если опущеными будут пармаетры, не имеющие значений по умолчанию, то при компиляции данного программного кода будет выдана ошибка о несоответствии числа параметров.
Значение опущенного параметра (одного или нескольких) определяется значениями по умолчанию для опускаемых параметров. Значение пропускаемого параметра равно значению по умолчанию (если таковое задано) или значению Неопределено, если для формального параметра не задано значение по умолчанию.
Копировать в буфер обменаПроцедура МояПроцедура(Параметр1, Параметр2 = "по умолчанию", Параметр3 = 16) … КонецПроцедуры // Параметр Параметр1 пропущен, значение параметра = Неопределено // Параметр Параметр2 указан, значение параметра = 1 МояПроцедура( ,1); // Параметр Параметр1 пропущен, значение параметра = Неопределено // Параметр Параметр2 пропущен, значение параметра = "по умолчанию" // Параметр Параметр3 опущен, значение параметра = 16 МояПроцедура(, ,); // Ошибка несоответствия количества параметров МояПроцедура();
Если при вызове метода параметры не передаются (пустой список параметров), то, тем не менее, круглые скобки обязательно требуется ставить.
Не следует передавать с клиента на сервер (и обратно), а также выполнять сериализацию данных, содержащих циклические ссылки. В этом случае будет выдаваться ошибка и сеанс будет завершаться.
При передаче с клиента на сервер и обратно строковых значений следует помнить, что эти значения не должны содержать символы, недопустимые с точки зрения спецификации XML версии 1.0 (http://www.w3.org/TR/xml/).
Совет. На стороне сервера такую проверку можно выполнить с помощью функции НайтиНедопустимыеСимволыXML().
Для конструкторов различных объектов понятие необязательности параметра трактуется особым образом. Если в описании конструктора указано, что параметр является необязательным, то это означает, что параметр может быть опущен, но не гарантируется, что этот параметр может быть пропущен. Опущенный параметр всегда имеет значение по умолчанию, а пропущенный параметр всегда получит значение Неопределено. В этом случае поведение конструктора зависит от реализации. Некоторые конструкторы могут воспринимать значение Неопределено как указание использовать некоторое значение по умолчанию, некоторые – воспринимают это значение буквально (с возможным формированием ошибки времени исполнения). Можно сформулировать следующую рекомендацию по использованию необязательных параметров:
● Не рекомендуется пропускать необязательные параметры.
● Если конструктор обладает необязательными параметрами – рекомендуется опускать все необязательные параметры, если не требуется явное указание какого-либо из них. В противном случае рекомендуется явно указывать все необязательные параметры, предшествующие параметру, который вы хотите указать явно.
4.7.4. Работа с коллекциями значений
Ряд объектов в языке системы «1С:Предприятие» представляет собой коллекции значений. Большинство коллекций имеют набор схожих методов и свойств, таких как Количество(), Индекс(), Добавить(), Удалить() и т. д. В качестве свойств коллекции, как правило, выступают ее элементы. Для коллекций доступен обход элементов коллекции посредством конструкции Для каждого – Из – Цикл. Для большинства коллекций доступно обращение к элементам коллекции с помощью оператора [<Аргумент>] (квадратные скобки). Как правило, в качестве аргумента передается индекс элемента коллекции. Индексирование элементов коллекции начинается с 0. Это означает, что индекс последнего элемента равен количеству элементов в коллекции минус 1.
Если в процессе обхода коллекции происходит удаление или другие изменения состава элементов, то дальнейшее поведение системы не определено.
Подробнее описание конкретных коллекций, их свойств, методов и приемов работы с ними см. в описаниях конкретных объектов.
4.7.5. Использование номеров и индексов
В языке системы «1С:Предприятие» есть ряд объектов, отдельные части которых имеют нумерацию. К таким объектам, например, относится строка, символы которой имеют номер в строке, или табличный документ, строки и колонки которого имеют номер, и т. п. При обращении к частям объектов обычно используется понятие Номер. Номера начинаются с 1.
При обращении к элементам коллекций используется понятие Индекс. Индексирование элементов коллекций начинается с 0.
4.7.6. Работа с системными перечислениями
Во встроенном языке системы «1С:Предприятие» существует понятие системных перечислений. Они предназначены для определения некоторого ограниченного набора предопределенных значений. Доступ к системным перечислениям осуществляется как к свойствам глобального контекста его имени. Конкретные значения указываются через точку от имени системного перечисления. Системные перечисления используются, как правило, для задания значений параметров системных методов или свойств объектов, а также в качестве возвращаемых значений методов.
4.7.7. Работа с предопределенными значениями
4.7.7.1. С помощью менеджера объекта
Получить предопределенное значение на стороне сервера «1С:Предприятия» можно с помощью менеджера соответствующего объекта. Строка, определяющая получаемый реквизит, имеет следующий вид:
Копировать в буфер обменаТипПредопределенногоЗначения.ИмяОбъектаМетаданных.Значение
Рассмотрим составляющие этой строки подробнее:
● ТипПредопределенногоЗначения – для получения предопределенных значений доступно указание следующих типов данных (написание во множественном числе):
● Справочники,
● ПланыВидовХарактеристик,
● ПланыСчетов,
● ПланыВидовРасчета,
● Перечисления.
● ИмяОбъектаМетаданных – указывается имя объекта метаданных так, как оно задано в конфигураторе.
● Значение – может быть одним из следующих:
● для перечислений указывается имя значения перечисления;
● для получения предопределенного значения указывается его имя, как оно задано в конфигураторе;
● ТочкиМаршрута.ИмяТочки – точка маршрута бизнес-процесса.
В случае, если требуется получить точку маршрута бизнес-процесса, строка, описывающая получаемое значение, будет выглядеть следующим образом:
Копировать в буфер обменаБизнесПроцессы.ИмяОбъектаМетаданных.ТочкиМаршрута.ИмяТочкиМаршрута
Пример:
Копировать в буфер обмена// Получение значения перечисления. Вид = Перечисления.ВидыТоваров.Товар; // Получение предопределенных данных справочника. Элемент = Справочники.Валюта.Рубль; // Точка маршрута бизнес-процесса Точка = БизнесПроцесс.Согласование.ТочкиМаршрута.Одобрение;
4.7.7.2. С помощью функции ПредопределенноеЗначение()
В связи с тем, что на стороне клиента недоступны прикладные объекты, получение предопределенных реквизитов с помощью менеджеров объектов становится невозможным. Поэтому для их получения существует метод глобального контекста ПредопределенноеЗначение(). Параметром этого метода является строка, описывающая то, какое предопределенное значение требуется получить. Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов (см. здесь).
Строка, определяющая получаемый реквизит, имеет следующий вид:
Копировать в буфер обменаТипПредопределенногоЗначения.ИмяОбъектаМетаданных.Значение
Рассмотрим составляющие этой строки подробнее:
● ТипПредопределенногоЗначения – для получения предопределенных значений доступно указание следующих типов данных (написание в единственном числе):
● Справочник,
● ПланВидовХарактеристик,
● ПланСчетов,
● ПланВидовРасчета,
● Перечисление,
● БизнесПроцесс.
● ИмяОбъектаМетаданных – указывается имя объекта метаданных так, как оно задано в конфигураторе.
● Значение – может быть одним из следующих:
● для перечислений указывается имя значения перечисления;
● для получения предопределенного значения указывается его имя, как оно задано в конфигураторе;
● ТочкаМаршрута.ИмяТочки – точка маршрута бизнес-процесса;
● ПустаяСсылка – для получения пустой ссылки.
В случае необходимости получить значение системного перечисления параметр метода будет выглядеть следующим образом: ИмяСистемногоПеречисления.ЗначениеСистемногоПеречисления.
Например:
Копировать в буфер обменаТипДиаграммы = ПредопределенноеЗначение("ТипДиаграммы.ВогнутаяПоверхность");
В случае если требуется получить точку маршрута бизнес-процесса, строка, описывающая получаемое значение, будет выглядеть следующим образом:
Пример:
Копировать в буфер обмена// Получение значения перечисления. Вид = ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар"); // Получение значения пустой ссылки. ПустаяСсылка = ПредопределенноеЗначение("Документ.РасходнаяНакл.ПустаяСсылка"); // Получение предопределенных данных справочника. Элемент = ПредопределенноеЗначение("Справочник.Валюта.Рубль"); // Точка маршрута бизнес-процесса Точка = ПредопределенноеЗначение("БизнесПроцесс.Согласование. ТочкаМаршрута.Одобрение");
4.7.8. Синхронные и асинхронные методы работы
4.7.8.1. Общая информация
При работе с объектами, которые реализуют некоторую, достаточно специфичную (работа с файлами, блокирующими окнами, криптографией и внешними компонентами), функциональность, можно выделить два различных подхода: синхронный и асинхронный. Отличие в этих подходах определяется их названиями.
При синхронном подходе вызов какого-либо метода объекта приведет к тому, что работа вызывающего кода будет остановлена до тех пор, пока не завершится вызов метода объекта (со всеми вложенными вызовами). Обычный вызов процедуры или функции встроенного языка является синхронным вызовом.
При асинхронном подходе вызов метода объекта выполняется как обычно, но управление сразу возвращается вызывающему коду и его исполнение продолжается. При этом вызванный метод гарантирует, что после завершения своей работы он оповестит о своем завершении заинтересованное «лицо» (если такое оповещение требуется). Оповещение выполняется с помощью вызова специального метода, который передается в вызываемый метод объекта. Все вышеописанное верно только для тех методов, для которых заявлена поддержка асинхронной работы.
В системе «1С:Предприятие» асинхронную технику можно использовать для работы:
1. С блокирующими окнами (см. здесь);
2. Расширением работы с файлами (см. здесь);
3. Расширением криптографии (см. здесь);
4. Внешними компонентами (см. здесь).
Все варианты предполагают асинхронное использование только на стороне клиентского приложения. На стороне сервера по-прежнему доступны синхронные техники работы, за исключением работы с блокирующими окнами (по причинам их отсутствия на стороне сервера).
Рассмотрим организацию асинхронного вызова на примере отображения предупреждения. Для асинхронного вывода предупреждения используется метод ПоказатьПредупреждение(). Для того, чтобы сообщить о том, что диалог предупреждения закрыт, в этот метод передается описание оповещения. Описание оповещения содержит имя и месторасположения процедуры, которая будет вызвана системой после закрытия диалога. Соответственно, метод ПоказатьПредупреждение() отличается от метода Предупреждение() тем, что в методе ПоказатьПредупреждение() существует еще один параметр, через который и передается описание оповещения. Эта разница означает, что метод поддерживает асинхронную работу.
Пример:
Копировать в буфер обмена&НаКлиенте Процедура ВыполнитьКоманду(Команда) ОбратныйВызов = Новый ОписаниеОповещения("ПредупреждениеЗавершение", ЭтотОбъект); ПоказатьПредупреждение(ОбратныйВызов, "Закрытие формы обрабатывается отдельно"); КонецПроцедуры &НаКлиенте Процедура ПредупреждениеЗавершение(ДополнительныеПараметры) Экспорт // какие-то действия КонецПроцедуры
Для описания оповещения используется специальный объект ОписаниеОповещения. При его создании необходимо указать имя процедуры оповещения, место ее (процедуры) расположения и дополнительные параметры, если необходимо. Дополнительные параметры могут использоваться процедурой обработки оповещения для своей работы. В приведенном выше примере дополнительные параметры не указываются.
Также следует отметить, что процедуры обработки оповещений (обратного вызова) могут располагаться только на стороне клиентского приложения в модуле формы, общем модуле и модуле команды. Процедура обратного вызова должна быть описана с ключевым словом Экспорт.
Таким образом, из приведенного примера видно, что работа с асинхронными методами существенно изменяет подходы к разработке. Основное изменение заключается в том, что единый фрагмент текста на встроенном языке (для случаев использования синхронных методов) разбивается на несколько изолированных фрагментов (в случае использования асинхронных методов).
Так, если в приведенном примере после отображения предупреждения должны были выполняться какие-то действия (именно после реакции пользователя, а не после вызова метода!), то эти действия следует перенести в процедуру ПредупреждениеЗавершение().
Более сложные алгоритмы, очевидно, приведут и к более сложному рефакторингу (см. здесь) исходного текста. Возможно, что переработки потребует сам алгоритм, а не только его реализация, которая может существенно усложниться. Например, в синхронном режиме, если алгоритму требуется какая-либо реакция пользователя, то эту реакцию получают непосредственно в том месте, где эта реакция требуется. Если перерабатывать такой алгоритм с использованием асинхронной техники, то логично разработать отдельный диалог, в котором пользователь ответит на все возможные вопросы, а затем результат этого «опроса» будет передан методу, который реализует нужный алгоритм. При этом вопросы «по месту» больше задавать не требуется, а вместо этого следует анализировать результаты «опроса» пользователя.
Кроме изменения подходов к разработке, при использовании асинхронных методов несколько изменяется и подход к обработке ошибок. Например, ошибки могут возникать в то время, когда код на встроенном языке не исполняется и нельзя использовать конструкцию Попытка … Исключение. Для обработки таких ситуаций при создании обработчика оповещения можно указать процедуру, которая будет вызываться системой при возникновении ошибки. Примером такой ошибки может быть ошибка, возникающая в процессе удаления файлов.
Пример:
Копировать в буфер обмена&НаКлиенте Процедура УдалитьВсеФайлыКаталога(ПутьККаталогу) ОбратныйВызов = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект, , "УдалитьОшибка", ЭтотОбъект); НачатьУдалениеФайлов(ОбратныйВызов, ПутьККаталогу, ПолучитьМаскуВсеФайлыКлиента()); КонецПроцедуры &НаКлиенте Процедура УдалитьЗавершение(ДополнительныеПараметры) Экспорт Сообщить("Удаление успешно завершено"); КонецПроцедуры &НаКлиенте Процедура УдалитьОшибка(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт Сообщить("При удалении обнаружена ошибка: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры
В приведенной реализации есть одна особенность: если во время удаления файлов произойдет ошибка, то наряду с сообщением об ошибке в окне сообщений платформы, пользователь увидит также и системный диалог с сообщением об ошибке. В том случае, если системный диалог не нужен – следует в обработчике УдалитьОшибка() установить параметр СтандартнаяОбработка в значение Ложь.
Также следует учитывать, что указание обработчика ошибок в описании оповещения игнорируется при использовании асинхронных методов работы с блокирующими окнами (см. здесь).
Еще одной особенностью работы с асинхронными вызовами является их отладка. В данный момент отладчик умеет отлаживать действия, которые синхронно выполняются в предмете отладки (фактически, по инициативе отладчика).
В случае использования асинхронных вызовов асинхронный вызов выполняется в момент времени, отличный от фактического выполнения строки кода на встроенном языке, которая инициирует данный вызов. В связи с этим, если во время фактического исполнения асинхронного вызова в этом вызове случается ошибка, отладчик не может корректно определить состояние отлаживаемого приложения. Поэтому недоступна текущая строка исполнения, стек вызовов и так далее.
4.7.8.2. Работа в веб-клиенте
Работа в веб-клиенте имеет некоторые особенности. Эти отличия вызваны особенностями реализации веб-браузеров (отсутствие поддержки модальных окон, синхронных вызовов, особенности модели безопасности).
Использование любой техники работы с файлами (см. здесь) и криптографией (см. здесь) требует специальных расширений, установленных в используемом веб-браузере. Расширения для работы синхронной и асинхронных техник различаются. При использования веб-браузера Google Chrome, перед установкой расширений платформы, необходимо выполнить установку расширения веб-браузера Расширение для работы с 1С:Предприятием, которое устанавливается из Интернет-магазина Chrome (переход на страницу установки будет выполнен автоматически, при необходимости). Без установки этого расширения будет невозможно использование расширений платформы, предназначенных для использования асинхронных способов работы.
Необходимо помнить, что поддержка синхронных вызовов в веб-браузере Google Chrome по умолчанию отключена в версии 42 (апрель 2015 года), а в версии 45 (сентябрь 2015 года) будет полностью удалена. При этом синхронные методы во встроенном языке (в веб-клиенте) также перестанут работать, несмотря на то, что сама платформа поддерживает эти вызовы.
При разработке прикладных решений рекомендуется использовать асинхронные способы работы с блокирующими диалогами, файлами, криптографией и внешними компонентами, т. к. использование синхронных методов (даже с использованием соответствующих расширений) может приводить к проблемам при работе в современных веб-браузерах.
Для работы с расширениями необходимо:
● Соответствующим образом настроить веб-браузер (см. здесь).
● Расширение работы с файлами:
● Установить расширение – с помощью метода НачатьУстановкуРасширенияРаботыСФайлами() или УстановитьРасширениеРаботыСФайлами(). Это интерактивное действие, которое необходимо выполнить один раз для каждого пользователя локального компьютера, использующего расширение.
● Подключить расширение – с помощью метода НачатьПодключениеРасширенияРаботыСФайлами() или ПодключитьРасширениеРаботыСФайлами().
● Расширение работы с криптографией:
● Установить расширение – с помощью метода НачатьУстановкуРасширенияРаботыСКриптографией() или УстановитьРасширениеРаботыСКриптографией().Это интерактивное действие, которое необходимо выполнить один раз для каждого пользователя локального компьютера, использующего расширение.
● Подключить расширение – с помощью метода НачатьПодключениеРасширенияРаботыСКриптографией() или ПодключитьРасширениеРаботыСКриптографией().
● Внешние компоненты – более подробно о работе с внешними компонентами см. здесь.
4.8. Особенности различных вариантов запуска системы
Система «1С:Предприятие» может использоваться в файловом и клиент-серверном вариантах, во внешнем соединении, а также в виде Интернет-сервисов (см. здесь).
Конфигуратор позволяет настроить использование процедур и функций общих модулей и модулей объектов для каждого варианта.
4.8.1. Исполнение процедур и функций
Для указания разрешения применения процедур и функций различных модулей (про виды модулей см. здесь) используют инструкции препроцессору и директивы компиляции.
4.8.1.1. Различие инструкций препроцессора и директив компиляции
Инструкции препроцессора и директивы компиляции предназначены для того, чтобы оставить в скомпилированном модуле только то, что действительно должно присутствовать в том или ином контексте. При этом инструкции препроцессора действуют на исходный текст модуля (т. е. удаляют из модуля текст, который не может там находится), а директивы компиляции действуют на структурные единицы программного кода (методы – процедуры или функции, а также объявления переменных).
Фактически все программные модули, присутствующие в системе, можно разделить на две большие группы модулей:
● Модули, которые могут существовать (и выполняться) только в одном контексте, например, модуль управляемого приложения может выполняться только на стороне клиента (тонкого или веб-клиента).
● Модули, которые могут существовать (и выполняться) в нескольких контекстах. Такими модулями является модуль управляемой формы, модуль команды и общий модуль. Например, модуль управляемой формы может существовать в четырех экземплярах, при этом в процессе работы управление может передаваться между различными экземплярами модуля:
● клиентский контекстный модуль,
● серверный контекстный модуль,
● клиентский внеконтекстный модуль,
● серверный внеконтекстный модуль.
При этом у модуля команды и общего модуля не может существовать контекстных экземпляров (в отличие от модуля формы). Поэтому некоторые модули могут компилироваться несколько раз, в зависимости от того, есть ли в этом модуле фрагменты кода, которые могут выполняться в том или ином контексте.
Рассмотрим, какое влияние оказывают директивы компиляции и инструкции препроцессора на исходный программный текст модуля в процессе его преобразования в «исполняемый» код.
Рассмотрим это на примере модуля управляемой формы.
В момент создания формы формируется четыре экземпляра модуля формы и выполняется определение всех необходимых инструкций препроцессору для каждого экземпляра модуля. Затем происходит обработка каждого экземпляра модуля и исключение текста, обрамленного инструкциями препроцессора.
Затем происходит компиляция получившегося программного кода в соответствии с контекстом и директивами компиляции. В результате получается исполняемый модуль.
Предположим, в исходном тексте модуля формы встречается конструкция:
Копировать в буфер обмена&НаКлиенте Процедура РаботаСФайлами() #Если ВебКлиент Тогда // программный текст 1 // исполняется только на веб-клиенте #Иначе // программный текст 2 // исполняется на других типах клиента #КонецЕсли КонецПроцедуры
Тогда будет выполнено следующее:
● Данная процедура будет компилироваться на любом клиенте (как следует из директивы компиляции).
● В то же время инструкции препроцессора будут определять, какой именно текст и на каком клиенте будет оставлен в модуле (и как следствие скомпилирован). В данном примере на веб-клиенте будет доступен только «программный текст 1», а на других клиентах – «программный текст 2».
Однако если в модуле формы будет использован следующий код:
Копировать в буфер обмена#Если НаСервере Тогда &НаКлиенте Процедура Клиентская() КонецПроцедуры #КонецЕсли
Тогда произойдет следующее:
● на сервере будет присутствовать исходный текст нашей процедуры, но он не будет скомпилирован, т. к. директива компиляции &НаКлиенте исключает возможность появления процедуры на стороне сервера;
● на клиенте не будет даже исходного текста нашей процедуры, т. к. его «вырежет» инструкция препроцессора, а значит, эта процедура не будет скомпилирована и не будет доступна для вызова.
Исходя из описанного механизма и следует подходить к пониманию взаимодействия директив и инструкций, а также к их совместному применению.
Также нужно отметить, что методы, отмеченные в программном модуле директивами &НаКлиентеНаСервереБезКонтекста и &НаКлиентеНаСервере, попадут одновременно в разные экземпляры программных модулей.
4.8.1.2. Инструкции препроцессора
Синтаксис инструкций препроцессору следующий:
Инструкция препроцессору
#Если <Логическое выражение> Тогда
#ИначеЕсли <Логическое выражение> Тогда
…
#Иначе
#КонецЕсли
Логическое выражение
<Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
Символ препроцессора
<Символ препроцессора> = { Сервер | НаСервере | Клиент | НаКлиенте | ТонкийКлиент | ВебКлиент | ВнешнееСоединение | ТолстыйКлиентУправляемоеПриложение | ТолстыйКлиентОбычноеПриложение | МобильноеПриложениеКлиент | МобильноеПриложениеСервер | Область | КонецОбласти }
Булева операция
<Булева операция> = {И | ИЛИ}
|
Русское имя |
Английское имя |
|
#Если |
#If |
|
#Тогда |
#Then |
|
#Иначе |
#Else |
|
#ИначеЕсли |
#ElsIf |
|
#КонецЕсли |
#EndIf |
|
#Область |
#Region |
|
#КонецОбласти |
#EndRegion |
|
И |
AND |
|
ИЛИ |
OR |
|
НЕ |
NOT |
|
Сервер |
Server |
|
НаСервере |
AtServer |
|
Клиент |
Client |
|
НаКлиенте |
AtClient |
|
ТонкийКлиент |
ThinClient |
|
ВебКлиент |
WebClient |
|
ВнешнееСоединение |
ExternalConnection |
|
ТолстыйКлиентУправляемоеПриложение |
ThickClientManagedApplication |
|
ТолстыйКлиентОбычноеПриложение |
ThickClientOrdinaryApplication |
|
МобильноеПриложениеКлиент |
MobileAppClient |
|
МобильноеПриложениеСервер |
MobileAppServer |
Далее приведен перечень инструкций препроцессора и их краткое описание:
● Сервер, НаСервере – определяет сервер;
● Клиент, НаКлиенте – определяет любого клиента;
● ТонкийКлиент – определяет тонкого клиента;
● ВебКлиент – определяет веб-клиента;
● ВнешнееСоединение – определяет внешнее соединение;
● ТолстыйКлиентУправляемоеПриложение – определяет режим управляемого приложения толстого клиента;
● ТолстыйКлиентОбычноеПриложение – определяет обычный режим толстого клиента;
● МобильноеПриложениеКлиент – определяет клиентскую часть мобильного приложения;
● МобильноеПриложениеСервер – определяет серверную часть мобильного приложения;
● Область, КонецОбласти – не предназначены для определения места выполнения кода на встроенном языке. Служат для выделения фрагмента текста, который можно будет свернуть (аналогично процедурам, функциям и т. д.). Подробнее см. здесь.
Далее приведена таблица, указывающая, какие инструкции препроцессора определены в каких режимах работы «1С:Предприятия»:
|
Режим |
Сервер, НаСервере |
Клиент, НаКлиенте |
ТонкийКлиент |
ВебКлиент |
ТолстыйКлиентУправляемоеПриложение |
ТолстыйКлиентОбычноеПриложение |
ВнешнееСоединение |
МобильноеПриложениеКлиент |
МобильноеПриложениеСервер |
|
В клиент-серверном варианте |
|
|
|||||||
|
На стороне сервера |
+ |
|
|
|
|
|
|
|
|
|
В толстом клиенте в обычном режиме |
|
+ |
|
|
|
+ |
|
|
|
|
В толстом клиенте в управляемом режиме |
|
+ |
|
|
+ |
|
|
|
|
|
В тонком клиенте |
|
+ |
+ |
|
|
|
|
|
|
|
В веб-клиенте |
|
+ |
|
+ |
|
|
|
|
|
|
Во внешнем соединении |
|
|
|
|
|
|
+ |
|
|
|
В файл-серверном варианте |
|
|
|||||||
|
В толстом клиенте в обычном режиме |
+ |
+ |
|
|
|
+ |
|
|
|
|
В толстом клиенте в управляемом режиме |
+ |
+ |
|
|
+ |
|
|
|
|
|
В тонком клиенте |
|
+ |
+ |
|
|
|
|
|
|
|
На серверной стороне тонкого клиента |
+ |
|
|
|
|
|
|
|
|
|
В веб-клиенте |
+ |
|
|
+ |
|
|
|
|
|
|
Во внешнем соединении |
|
|
|
|
|
|
+ |
|
|
|
В клиенте мобильного приложения |
|
+ |
|
|
|
|
|
+ |
|
|
На серверной стороне мобильного приложения |
+ |
|
|
|
|
|
|
|
+ |
Если используется неглобальный общий модуль, для которого установлено использование на клиенте (любом) и на сервере, то методы, заключенные в условие #Если Сервер Тогда #КонецЕсли, будут доступны только в том случае, если вызов этих методов выполняется со стороны сервера. Вызов таких методов со стороны клиента недоступен.
В модуле управляемой формы, выполняемой в файловом варианте в толстом клиенте, будет различаться инструкции Сервер и НаСервере, а также Клиент и НаКлиенте. Так, директивы Сервер и Клиент будут определены и в клиентских и в серверных экземплярах модуля формы, в том время как директива НаСервере будет определена только в серверных экземплярах модуля формы, а директива НаКлиенте – только в клиентских экземплярах модуля формы. Подробнее о разделении модуля формы на различные экземпляры см. здесь.
В остальных случаях инструкции Сервер и НаСервере полностью идентичны и инструкции Клиент и НаКлиенте также полностью идентичны.
Примечание. Перед передачей программного модуля на тонкий или веб-клиент сервер выполняет обработку инструкций препроцессора, находящихся в модуле. В ходе обработки текст на встроенном языке, который не исполняется на стороне вышеуказанных клиентов, заменяется на пробелы (т. е. фактически удаляется). При этом символы переноса строк и табуляции остаются на своих местах.
4.8.1.3. Директивы компиляции
Синтаксис директивы компиляции следующий:
Директива компиляции
&<Директива>
<Конструкция языка>
Директива
<Директива> = { НаКлиенте | НаСервере | НаСервереБезКонтекста | НаКлиентеНаСервереБезКонтекста | НаКлиентеНаСервере }
Конструкция языка
<Конструкция языка> = { <Описание переменной> | <Описание процедуры> | <Описание функции> }
Подробное описание конструкций языка см. здесь.
|
Русское имя |
Английское имя |
|
НаКлиенте |
AtClient |
|
НаСервере |
AtServer |
|
НаСервереБезКонтекста |
AtServerNoContext |
|
НаКлиентеНаСервереБезКонтекста |
AtClientAtServerNoContext |
|
НаКлиентеНаСервере |
AtClientAtServer |
Далее приведен перечень директив компиляции и их краткое описание:
● НаКлиенте – означает, что метод выполняется на стороне клиента в контексте формы.
Переменная существует все время жизни клиентской части формы.
Из метода доступны клиентские переменные модуля формы.
Допустимы вызовы любых методов.
● НаСервере – означает, что метод выполняется на стороне сервера в контексте формы.
Переменная существует только во время вызова выполнения серверного вызова.
Из метода доступны серверные переменные модуля формы.
Допустимы вызовы:
● серверных;
● серверных внеконтекстных;
● клиент-серверных внеконтекстных методов;
● методов неглобальных серверных общих модулей.
● НаСервереБезКонтекста – означает, что метод исполняется на сервере вне контекста формы.
Переменные не могут предваряться такой директивой компиляции.
Из метода недоступны переменные модуля формы.
Допустимы вызовы:
● серверных внеконтекстных;
● клиент-серверных внеконтекстных методов;
● методов не глобальных серверных общих модулей.
● НаКлиентеНаСервереБезКонтекста – означает, что метод исполняется как на клиенте, так и на сервере, вне контекста формы.
Переменные не могут предваряться такой директивой компиляции.
Из метода недоступны переменные модуля формы.
Допустимы вызовы:
● серверных внеконтекстных;
● клиент-серверных внеконтекстных методов;
● методов неглобальных серверных общих модулей;
● методов неглобальных общих модулей с флажками Сервер и Клиент (управляемое приложение).
Не поддерживается вызов экспортных процедур, обозначенных такой директивой, как методов объекта ЭтотОбъект.
● НаКлиентеНаСервере – означает, что методы выполняются на клиенте и на сервере. Переменные не могут предваряться такой директивой компиляции.
Допустимы вызовы:
● серверных внеконтекстных;
● клиент-серверных внеконтекстных методов;
● методов неглобальных серверных общих модулей;
● методов неглобальных общих модулей с флажками Сервер и Клиент (управляемое приложение).
Ниже приведена таблица, показывающая, какие директивы компиляции доступны в каких модулях системы «1С:Предприятие»:
|
|
Модуль |
Перемен- |
Модуль |
Общий |
|
НаКлиенте |
+ |
+ |
+ |
+ |
|
НаСервере |
+ |
+ |
+ |
+ |
|
НаСервереБезКонтекста |
+ |
|
|
|
|
НаКлиентеНаСервереБезКонтекста |
+ |
|
|
|
|
НаКлиентеНаСервере |
|
|
+ |
|
4.8.2. Особенности использования объектов, их свойств и методов
Каждый объект, метод или свойство встроенного языка (далее в этом разделе – объект) обладает определенной доступностью (см. синтакс-помощник), которая определяет, где можно использовать объект, метод или свойство. Кроме того, в синтакс-помощнике указываются некоторые вспомогательные данные, которые могут помочь разработчику.
Тонкий клиент – указывает, что объект доступен в тонком клиенте.
Веб-клиент – указывает, что объект доступен в веб-клиенте.
Сервер – указывает, что объект доступен на сервере «1С:Предприятия».
Внешнее соединение – указывает, что объект доступен в режиме внешнего соединения.
Толстый клиент – указывает, что объект доступен в толстом клиенте.
Мобильное приложение (клиент) – указывает, что объект доступен в клиентской части мобильной платформы.
Мобильное приложение (сервер) – указывает, что объект доступен на стороне сервера мобильной платформы.
ВНИМАНИЕ! Если для объекта указано, что он недоступен для какого-либо из режимов запуска, то свойства и методы данного объекта также недоступны. Поэтому специального упоминания об этом при описании свойств и методов не приводится.
Примечание. Если объект недоступен на стороне какого-либо клиентского приложения, то в этом клиентском приложении также недоступен и тип этого объекта. Например, если в тонком клиенте недоступен объект СправочникОбъект.Контрагенты, то Тип("СправочникОбъект.Контрагенты") также недоступен в тонком клиенте.
Сериализуется. Указывает возможность сохранения значения объектов (например, методами СохранитьЗначение() и ЗначениеВФайл()), сохранения параметров форм отчетов и обработок), а также помещения в ХранилищеЗначения.
Данный объект может быть сериализован в/из XML. Указывает возможность поддержки чтения/записи значений данных системы «1С:Предприятие» в/из XML. Подробнее см. здесь.
Возможен обмен с сервером. Указывает возможность обмена значениями данного типа между клиентом и сервером.
Примечание. Для управляемого режима запуска обмен между клиентом и сервером возможен для объектов, которые поддерживают XDTO-сериализацию.
Данный объект может быть сериализован в/из XDTO. Указывает на то, что данный тип имеет возможность отображения в модель данных XDTO. При этом указывается квалифицированное имя типа (типов) (указывается URI пространство имен и имя типа), в который отображается данный тип. Например, для типа ХранилищеЗначения: {http://v8.1c.ru/8/data/core}ValueStorage.
Синтакс-помощник содержит информацию о кешировании результатов работы некоторых методов «1С:Предприятия». Например, для метода глобального контекста ПредопределенноеЗначение() будет указана следующая информация: Результат выполнения кешируется при первом обращении до изменения конфигурации или версии платформы.